export default class Stack<T>{
    // 记录栈的大小
    private count:number;
    private items: any;
    constructor(){
        this.count = 0;
        this.items = {};
    }
    /**
     * 向栈中插入元素
     * @param element T
     * 使用count变量作为items对象的键名，
     * 插入的元素是它的值，
     * 在向栈中插入元素后，递增count变量
     */
    push(element:T){
        this.items[this.count] = element;
        this.count++;
    }

    /**
     * 从栈中弹出元素
     * 1.检验栈是否为空，如果为空返回undefeated
     * 2.不为空，将count--，并保存栈顶的值
     */
    pop(){
        if(this.isEmpty()){
            return undefined
        }
        this.count--;
        const result = this.items[this.count];
        delete this.items[this.count];
        return result;
    }
    /**
     * 查看栈顶元素
     * 1.检验是否为空，如为空就返回undefined
     * 2.不为空，将count-1，返回值
     */
    peek(){
        if(this.isEmpty()){
            return undefined
        }
        return this.items[this.count - 1];
    }

    /**
     * 清空栈
     */
    clear(){
        this.count = 0;
        this.items = {};
    }
    
    /**
     * 栈的大小
     */
    size(){
        return this.count;
    }

    /**
     * 栈是否为空
     */
    isEmpty(){
        return this.count === 0;
    }

    /**
     * 创建toString方法
     * 1.如果栈为空，返回空字符串
     * 2.如果不为空就从底部迭代到栈顶拼成字符串输出
     */
    toString(){
        if(this.isEmpty()) return "";
        let objString = `${this.items[0]}`;
        for(let i=1;i<this.count;i++){
            objString = `${objString},${this.items[i]}`;
        }
        return objString;
    }
}